/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package controle.modelo;

import controle.database.ConectaBanco;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import modelo.Linha;
import modelo.Pedido;

/**
 *
 * @author Luiz Cunha
 */
public class ControlePedido
{

    ConectaBanco conn;

    public ControlePedido()
    {
        conn = new ConectaBanco();
    }

    private Pedido preenchePedido(ResultSet resultSet)
    {
        ControleLinha controleLinha = new ControleLinha();
        ControleUsuario controleUsuario = new ControleUsuario();
        ControleCliente controleCliente = new ControleCliente();
        ControleTipoDePagamento controleTipoDePagamento = new ControleTipoDePagamento();
        try
        {
            java.sql.Date date = resultSet.getDate("data");
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);

            return new Pedido(
                    resultSet.getInt("id_pedido"),
                    resultSet.getDouble("valor_total"),
                    controleLinha.getLinhasPorPedido(resultSet.getInt("id_pedido")),
                    controleUsuario.getUsuarioById(resultSet.getInt("id_usuario")),
                    controleCliente.getClienteById(resultSet.getInt("id_cliente")),
                    controleTipoDePagamento.getTipoDePagamentoById(resultSet.getInt("id_tipo_de_pagamento")),
                    calendar
            );

        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return null;
    }

    public Pedido getUltimoPedido()
    {
        conn.conexao();
        try
        {
            PreparedStatement pst = conn.conn.prepareStatement("select currval('pedido_id_pedido_seq')");
            ResultSet resultSet = pst.executeQuery();
            resultSet.next();
            return this.getPedidoById(resultSet.getInt(1));
        }
        catch (Exception e)
        {
            e.printStackTrace();
            conn.desconecta();
        }
        return null;
    }

    public List<Pedido> getAllPedidos()
    {
        List<Pedido> tempPedidos = new ArrayList<>();
        conn.conexao();
        try
        {
            PreparedStatement pst = conn.conn.prepareStatement("select * from pedido ORDER BY data");
            ResultSet resultSet = pst.executeQuery();
            while (resultSet.next())
            {
                tempPedidos.add(preenchePedido(resultSet));
            }
            conn.desconecta();
            return tempPedidos;
        }
        catch (Exception e)
        {
            e.printStackTrace();
            conn.desconecta();
        }
        return null;

    }

    public void deletePedido(Pedido pedido)
    {
        conn.conexao();
        try
        {
            PreparedStatement pst = conn.conn.prepareStatement("DELETE FROM PEDIDO WHERE id_pedido = ?");
            pst.setInt(1, pedido.getIdPedido());
            pst.execute();
        }
        catch (Exception e)
        {
            e.printStackTrace();
            conn.desconecta();
        }
    }

    public Integer addPedido(Pedido pedido)
    {
        conn.conexao();
        try
        {
            PreparedStatement pst = conn.conn.prepareStatement("INSERT INTO PEDIDO (id_cliente, id_usuario, id_tipo_de_pagamento, data) VALUES (?,?,?,?)");

            if (pedido.getCliente() == null)
            {
                pst.setNull(1, java.sql.Types.INTEGER);
            }
            else
            {
                pst.setInt(1, pedido.getCliente().getIdCliente());
            }

            pst.setInt(2, pedido.getUsuario().getIdUsuario());
            pst.setInt(3, pedido.getTipoDePagamento().getIdTipoDePagamento());
            java.sql.Date date = new Date(pedido.getCalendar().getTime().getTime());
            pst.setDate(4, date);
            pst.execute();
            pst = conn.conn.prepareStatement("SELECT currval('pedido_id_pedido_seq')");
            ResultSet resultSet = pst.executeQuery();
            resultSet.next();
            Integer generatedId = resultSet.getInt(1);
            conn.desconecta();
            return generatedId;
        }
        catch (Exception e)
        {
            e.printStackTrace();
            conn.desconecta();

        }

        return null;
    }

    public void updatePedido(Pedido pedido)
    {
        conn.conexao();
        try
        {
            ControleLinha controleLinha = new ControleLinha();
            PreparedStatement pst = conn.conn.prepareStatement("UPDATE pedido SET valor_total = ?, id_cliente = ?, id_usuario = ?, id_tipo_de_pagamento = ? WHERE id_pedido = ?");

            pst.setDouble(1, pedido.getValorTotal());

            if (pedido.getCliente() == null)
            {
                pst.setNull(2, java.sql.Types.INTEGER);
            }
            else
            {
                pst.setInt(2, pedido.getCliente().getIdCliente());
            }

            pst.setInt(3, pedido.getUsuario().getIdUsuario());
            pst.setInt(4, pedido.getTipoDePagamento().getIdTipoDePagamento());
            pst.setInt(5, pedido.getIdPedido());
            pst.execute();

            
        }
        catch (Exception e)
        {
            e.printStackTrace();
            conn.desconecta();
        }
    }

    public List<Pedido> getPedidosByDateRange(Calendar startDate, Calendar endDate)
    {
        conn.conexao();
        try
        {
            List<Pedido> tempListPedido = new ArrayList<>();
            PreparedStatement pst = conn.conn.prepareStatement("SELECT * FROM pedido WHERE data BETWEEN ? AND ? ORDER BY data");
            java.sql.Date sqlStartDate = new Date(startDate.getTime().getTime());
            java.sql.Date sqlEndDate = new Date(endDate.getTime().getTime());
            pst.setDate(1, sqlStartDate);
            pst.setDate(2, sqlEndDate);
            ResultSet resultSet = pst.executeQuery();
            while (resultSet.next())
            {
                tempListPedido.add(preenchePedido(resultSet));
            }
            conn.desconecta();
            return tempListPedido;

        }
        catch (Exception e)
        {
            e.printStackTrace();
            conn.desconecta();
        }
        return null;
    }

    public Pedido getPedidoById(Integer idPedido)
    {
        conn.conexao();
        try
        {
            PreparedStatement pst = conn.conn.prepareStatement("SELECT * FROM pedido WHERE id_pedido = ?");
            pst.setInt(1, idPedido);
            ResultSet resultSet = pst.executeQuery();
            resultSet.next();
            Pedido pedido = preenchePedido(resultSet);
            conn.desconecta();
            
            ControleLinha controleLinha = new ControleLinha();
            pedido.setLinhas(controleLinha.getLinhasPorPedido(idPedido));
            
            return pedido;
        }
        catch (Exception e)
        {
            e.printStackTrace();
            conn.desconecta();
        }
        return null;
    }
}
